#include <stdio.h>
#include <unistd.h>
#include "ohos_init.h"
#include "cmsis_os2.h"
#include "iot_gpio.h"
#include "hi_gpio.h"
#include "hi_io.h"
#include "hi_errno.h"

#define PIR_GPIO 11       // HC-SR501模块输出连接GPIO11
#define LED_GPIO 10      // LED连接GPIO10
#define CHECK_INTERVAL 500000  // 检测间隔(微秒)，500ms

// 初始化GPIO引脚
static void InitGpio(void) {
    // 初始化PIR传感器引脚
    IoTGpioInit(PIR_GPIO);
    hi_io_set_func(PIR_GPIO, HI_IO_FUNC_GPIO_1_GPIO);  // 使用您确认的宏
    IoTGpioSetDir(PIR_GPIO, IOT_GPIO_DIR_IN);           // 设置为输入模式
    
    // 初始化LED引脚
    IoTGpioInit(LED_GPIO);
    hi_io_set_func(LED_GPIO, HI_IO_FUNC_GPIO_10_GPIO);  // 配置为普通GPIO
    IoTGpioSetDir(LED_GPIO, IOT_GPIO_DIR_OUT);          // 设置为输出模式
    
    // 初始状态LED熄灭
    IoTGpioSetOutputVal(LED_GPIO, 0);
}

// 主任务：检测PIR传感器并控制LED
static void *PirLedTask(void *arg) {
    (void)arg;
    uint32_t pirValue = 0;
    uint32_t lastValue = 0;
    
    printf("HC-SR501 PIR Sensor Demo Started...\n");
    
    // 传感器预热时间(根据模块特性可能需要10-60秒)
    printf("Sensor warming up, please wait...\n");
    usleep(10000000);  // 预热10秒
    
    printf("Sensor ready!\n");
    
    while (1) {
        // 读取PIR传感器状态
        IoTGpioGetInputVal(PIR_GPIO, &pirValue);
        
        // 仅在状态变化时输出信息，减少日志量
        if (pirValue != lastValue) {
            printf("Motion detected: %s\n", pirValue ? "YES" : "NO");
            lastValue = pirValue;
        }
        
        // 根据传感器状态控制LED
        // 高电平：检测到人体移动，LED亮起
        // 低电平：无人活动或人体离开，LED熄灭
        IoTGpioSetOutputVal(LED_GPIO, pirValue);
        
        // 延时500ms
        usleep(CHECK_INTERVAL);
    }
    
    return NULL;
}

// 系统初始化入口
static void PirLedDemoEntry(void) {
    osThreadAttr_t attr;
    
    // 初始化GPIO
    InitGpio();
    
    // 创建PIR检测任务
    attr.name = "PirLedTask";
    attr.attr_bits = 0U;
    attr.cb_mem = NULL;
    attr.cb_size = 0U;
    attr.stack_mem = NULL;
    attr.stack_size = 512;
    attr.priority = 25;
    
    if (osThreadNew((osThreadFunc_t)PirLedTask, NULL, &attr) == NULL) {
        printf("Failed to create PirLedTask!\n");
    }
}

// 注册系统启动任务
SYS_RUN(PirLedDemoEntry);